home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / GEMFUNCS / GRFBLIT.C < prev    next >
C/C++ Source or Header  |  1993-02-01  |  4KB  |  125 lines

  1. /**************************************************************************
  2.  * GRFBLIT.C - grf_memblit() function.
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. static long dmyfdb = 0L; /* dummy "fdb" (0L) describes the physical screen */
  8.  
  9. /**************************************************************************
  10.  * grf_blit - blit a rectangle between screen and buffer.
  11.  *************************************************************************/
  12.  
  13. long grf_blit(options, buffer, prect)
  14.     short               options;
  15.     void            *buffer;
  16.     void            *prect;
  17. {
  18.     GRECT            scrnrect;      /* rectangle on the screen               */
  19.     GRECT            memrect;      /* rectangle in memory (x/y always zero) */
  20.     FDB             memfdb;       /* FDB describing memory buffer           */
  21.     register short    wdwidth;      /* width of memory buffer in words       */
  22.     register long    mem_needed;   /* memory needed to do the blit           */
  23.     register FDB    *srcefdb;      /* source FDB pointer                    */
  24.     register FDB    *destfdb;      /* destination FDB pointer               */
  25.     register short      vdi_handle;    /* Handle for temp VDI workstation         */
  26.     struct    {                      /* This is the 'pxy array' used in the   */
  27.             VRECT    srce;          /* VDI blit command; actually two VRECT- */
  28.             VRECT    dest;          /* type rectangles stuck back-to-back    */
  29.             } blitcoords;          /* so it looks like an array.            */
  30.  
  31. /*----------------------------------------------------------------------*
  32.  * validate parms, open a vdi workstation...
  33.  *----------------------------------------------------------------------*/
  34.  
  35.     mem_needed = 0;             /* assume failure */
  36.  
  37.     wind_update(BEG_UPDATE);
  38.  
  39.     if (!(options & (GRF_BFROMSCREEN|GRF_BTOSCREEN|GRF_BMEMCALC))) {
  40.         goto BYPASS_BLIT;
  41.     }
  42.  
  43.     if (prect == NULL || (buffer == NULL && !(options & GRF_BMEMCALC))) {
  44.         goto BYPASS_BLIT;
  45.     }
  46.  
  47.     if (0 == (vdi_handle = apl_vshared())) {
  48.         goto BYPASS_BLIT;
  49.     }
  50.  
  51. /*----------------------------------------------------------------------*
  52.  * get the screen rectangle, clip it to the physical screen...
  53.  *----------------------------------------------------------------------*/
  54.  
  55.     if (options & GRF_BOBJTREE) {
  56.         frm_sizes((OBJECT *)prect, &scrnrect);
  57.     } else{
  58.         rc_copy(prect, &scrnrect);
  59.     }
  60.  
  61.     if (!rc_intersect(&gl_rfscrn, &scrnrect)) {
  62.         goto BYPASS_BLIT;
  63.     }
  64.  
  65. /*----------------------------------------------------------------------*
  66.  * set up the buffer rectangle...
  67.  *----------------------------------------------------------------------*/
  68.  
  69.     memrect.g_x = 0;
  70.     memrect.g_y = 0;
  71.     memrect.g_w = scrnrect.g_w;
  72.     memrect.g_h = scrnrect.g_h;
  73.  
  74. /*----------------------------------------------------------------------*
  75.  * set up the fdb describing the buffer.
  76.  *----------------------------------------------------------------------*/
  77.  
  78.     wdwidth = (scrnrect.g_w + 15) / 16;
  79.  
  80.     memfdb.fd_nplanes = gl_vxout[4];
  81.     memfdb.fd_stand   = 0;
  82.     memfdb.fd_w       = scrnrect.g_w;
  83.     memfdb.fd_h       = scrnrect.g_h;
  84.     memfdb.fd_wdwidth = wdwidth;
  85.     memfdb.fd_addr      = buffer;
  86.  
  87.     mem_needed = (2 * (wdwidth * (long)(scrnrect.g_h * memfdb.fd_nplanes)));
  88.  
  89.     if ((options & GRF_BMEMCALC) || mem_needed == 0) {
  90.         goto BYPASS_BLIT;
  91.     }
  92.  
  93. /*----------------------------------------------------------------------*
  94.  * do the blit.
  95.  *----------------------------------------------------------------------*/
  96.  
  97.     if (options & GRF_BFROMSCREEN) {
  98.         rc_gtov(&scrnrect, &blitcoords.srce);
  99.         rc_gtov(&memrect,  &blitcoords.dest);
  100.         srcefdb = (FDB *)&dmyfdb;
  101.         destfdb = &memfdb;
  102.     } else {
  103.         rc_gtov(&memrect,  &blitcoords.srce);
  104.         rc_gtov(&scrnrect, &blitcoords.dest);
  105.         srcefdb = &memfdb;
  106.         destfdb = (FDB *)&dmyfdb;
  107.     }
  108.  
  109.     graf_mouse(M_OFF, 0L);
  110.     vro_cpyfm(vdi_handle, S_ONLY, (short *)&blitcoords, srcefdb, destfdb);
  111.     graf_mouse(M_ON, 0L);
  112.  
  113. /*----------------------------------------------------------------------*
  114.  * all done, return.
  115.  *----------------------------------------------------------------------*/
  116.  
  117. BYPASS_BLIT:
  118.  
  119.     wind_update(END_UPDATE);
  120.     return mem_needed;
  121. }
  122.  
  123.  
  124.  
  125.